package leetcodehot;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class leetcode17_phoneNumber {

    /*
        主要思路：号码与字母封装到哈希表中，进行回溯操作：
     */

    //存放结果。
    private static List<String> res = new ArrayList<>();

    //创建哈希表 存放号码字母
    private  static  HashMap<Character, String> map = new HashMap<>(){
        {  put('2', "abc");
            put('3', "def");
            put('4', "ghi");
            put('5', "jkl");
            put('6', "mno");
            put('7', "pqrs");
            put('8', "tuv");
            put('9', "wxyz");
        }
    };

    //存放中间件。
    private static StringBuilder sb = new StringBuilder();

    public static List<String> letterCombinations(String digits) {

        if(digits.length()==0){
            return res;
        }
        backtrack(digits ,0);
        return res;

    }

    /*/
        回溯函数:输入参数， 下标值。
        拿到参数下标0对应得值在哈希表中对应得value 并循环，在此回调。
     */
    private static void backtrack(String digits, int index){

        if(sb.length() == digits.length()){  //当sb长度等于2(digits.length())得时候把值add到res集合里 并删除sb数据。见 sb.deleteCharAt(index);
            res.add(sb.toString());
            return;
        }
        String tmp = map.get(digits.charAt(index));
        for(char s : tmp.toCharArray()){
            sb.append(s);
            backtrack(digits,index+1);
            //sb数据存放到res并对sb这部操作删除，也就是 “ae” "a" "" 这个过程。
            sb.deleteCharAt(index);
        }
    }

    public static void main(String[] args) {
        System.out.println(letterCombinations(""));
    }
}
